home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 42 / Amiga Format AFCD42 (Issue 126, Aug 1999).iso / -serious- / comms / other / slrn / slrn_src / src / startup.c < prev    next >
C/C++ Source or Header  |  1999-05-14  |  30KB  |  1,228 lines

  1. /* -*- mode: C; mode: fold; -*- */
  2. /* Copyright (c) 1998 John E. Davis (davis@space.mit.edu)
  3.  *
  4.  * This file is part of slrn.
  5.  *
  6.  * Slrn is free software; you can redistribute it and/or modify it
  7.  * under the terms of the GNU General Public License as published by the
  8.  * Free Software Foundation; either version 2, or (at your option) any
  9.  * later version.
  10.  * 
  11.  * Slrn is distributed in the hope that it will be useful, but WITHOUT
  12.  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13.  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14.  * for more details.
  15.  * 
  16.  * You should have received a copy of the GNU General Public License
  17.  * along with Slrn; see the file COPYING.  If not, write to the Free
  18.  * Software Foundation, 59 Temple Place - Suite 330, 
  19.  * Boston, MA  02111-1307, USA.
  20.  */
  21.  
  22. /* Read startup .slrnrc file */
  23.  
  24. #include "config.h"
  25. #include "slrnfeat.h"
  26.  
  27. /*{{{ Include Files */
  28.  
  29. #include <stdio.h>
  30. #ifdef HAVE_STDLIB_H
  31. # include <stdlib.h>
  32. #endif
  33.  
  34. #include <string.h>
  35. #include <slang.h>
  36.  
  37. #include "jdmacros.h"
  38.  
  39. #include "slrn.h"
  40. #include "group.h"
  41. #include "misc.h"
  42. #include "art.h"
  43. #include "post.h"
  44. #include "startup.h"
  45. #include "score.h"
  46. #include "util.h"
  47. #include "uudecode.h"
  48. #if SLRN_HAS_MIME
  49. # include "mime.h"
  50. #endif
  51. #if SLRN_HAS_GROUPLENS
  52. # include "grplens.h"
  53. #endif
  54. #if SLRN_HAS_SLANG
  55. # include "interp.h"
  56. #endif
  57. #include "server.h"
  58. #include "chmap.h"
  59. #include "print.h"
  60.  
  61. #ifdef VMS
  62. # include "vms.h"
  63. #endif
  64. /*}}}*/
  65.  
  66. /*{{{ Forward Function Declarations */
  67.  
  68. static int unsetkey_fun (int, SLcmd_Cmd_Table_Type *);
  69. static int setkey_fun (int, SLcmd_Cmd_Table_Type *);
  70. static int server_fun (int, SLcmd_Cmd_Table_Type *);
  71. static int color_fun (int, SLcmd_Cmd_Table_Type *);
  72. static int mono_fun (int, SLcmd_Cmd_Table_Type *);
  73. static int user_data_fun (int, SLcmd_Cmd_Table_Type *);
  74. static int ignore_quote_fun (int, SLcmd_Cmd_Table_Type *);
  75. static int autobaud_fun (int, SLcmd_Cmd_Table_Type *);
  76. static int set_variable_fun (int, SLcmd_Cmd_Table_Type *);
  77. static int nnrp_fun (int, SLcmd_Cmd_Table_Type *);
  78. static int grouplens_fun (int, SLcmd_Cmd_Table_Type *);
  79. static int interpret_fun (int, SLcmd_Cmd_Table_Type *);
  80. static int include_file_fun (int, SLcmd_Cmd_Table_Type *);
  81. static int set_header_format_fun (int, SLcmd_Cmd_Table_Type *);
  82. static int set_visible_headers_fun (int, SLcmd_Cmd_Table_Type *);
  83.  
  84. /*}}}*/
  85. /*{{{ Static Global Variables */
  86.  
  87. static int This_Line_Num;           /* current line number in startup file */
  88. static char *This_File;
  89. static char *This_Line;               /* line being parsed */
  90.  
  91. char *Server_Object;
  92. char *Post_Object;
  93.  
  94. static SLcmd_Cmd_Table_Type Slrn_Cmd_Table;
  95. static SLcmd_Cmd_Type Slrn_Startup_File_Cmds[] = /*{{{*/
  96. {
  97.      {unsetkey_fun, "unsetkey", "SS"},
  98.      {setkey_fun, "setkey", "SSS"},
  99.      {server_fun, "server", "SS"},
  100.      {color_fun, "color", "SSS"},
  101.      {mono_fun, "mono", "SSsss"},
  102.      {set_variable_fun, "set", "SG"},
  103.      {user_data_fun, "hostname", "S"},
  104.      {nnrp_fun, "nnrpaccess", "SSS" },
  105. #define SLRN_MAX_QUOTE_REGEXP 5
  106.      {ignore_quote_fun, "ignore_quotes", "Sssss"},
  107.      {autobaud_fun, "autobaud", ""},
  108.      {grouplens_fun, "grouplens_add", "S"},
  109.      {interpret_fun, "interpret", "S"},
  110.      {include_file_fun, "include", "S"},
  111.      {set_header_format_fun, "header_display_format", "IS"},
  112.      {user_data_fun, "scorefile", "S"},
  113.      {set_visible_headers_fun, "visible_headers", "S"},
  114.  
  115.    /* The following are considered obsolete */
  116.      {user_data_fun, "username", "S"},
  117.      {user_data_fun, "replyto", "S"},
  118.      {user_data_fun, "organization", "S"},
  119.      {user_data_fun, "signature", "S"},
  120.      {user_data_fun, "realname", "S"},
  121.      {user_data_fun, "followup", "S"},
  122.      {user_data_fun, "cc_followup_string", "S"},
  123.      {user_data_fun, "quote_string", "S"},
  124. #if SLRN_HAS_DECODE
  125.      {user_data_fun, "decode_directory", "S"},
  126. #endif
  127.      {user_data_fun, "editor_command", "S"},
  128.      {NULL, "", ""}
  129. };
  130.  
  131. /*}}}*/
  132.  
  133. /*}}}*/
  134. /*{{{ Public Global Variables */
  135.  
  136. SLRegexp_Type *Slrn_Ignore_Quote_Regexp [SLRN_MAX_QUOTE_REGEXP + 1];
  137. int Slrn_Autobaud = 0;
  138. char *Slrn_Score_File;
  139. int Slrn_Scroll_By_Page;
  140.  
  141. /*}}}*/
  142.  
  143. /*{{{ Utility Functions */
  144.  
  145. static void exit_malloc_error (void) /*{{{*/
  146. {
  147.    if (This_File == NULL)
  148.      slrn_exit_error ("Memory Allocation Failure");
  149.    
  150.    slrn_exit_error ("%s: Line %d\n%sMemory Allocation Failure",
  151.             This_File, This_Line_Num, This_Line);
  152. }
  153.  
  154. /*}}}*/
  155.  
  156. static char *safe_malloc (unsigned int n) /*{{{*/
  157. {
  158.    char *s;
  159.    s = (char *) SLMALLOC (n);
  160.    if (s == NULL) exit_malloc_error ();
  161.    return s;
  162. }
  163.  
  164. /*}}}*/
  165.  
  166.  
  167. static void exit_unknown_object (void) /*{{{*/
  168. {
  169.    slrn_exit_error ("%s: Error encountered processing line %d\n%s",
  170.             This_File, This_Line_Num, This_Line);
  171. }
  172.  
  173. /*}}}*/
  174.  
  175. static void issue_obsolete_message (void) /*{{{*/
  176. {
  177.    slrn_message ("%s: Command is obsolete on line %d:\n%s",
  178.          This_File, This_Line_Num, This_Line);
  179.    slrn_message ("The new usage is:\nset %s\n", This_Line);
  180. }
  181.  
  182. /*}}}*/
  183.  
  184.    
  185. /*}}}*/
  186. /*{{{ Set/Unset Key Functions */
  187.  
  188. static int setkey_fun (int argc, SLcmd_Cmd_Table_Type *table) /*{{{*/
  189. {
  190.    char *map = table->string_args[1];
  191.    char *fun = table->string_args[2];
  192.    char *key = table->string_args[3];
  193.    SLKeyMap_List_Type *kmap = NULL;
  194.    
  195.    (void) argc;
  196.  
  197.    if (!strcmp (map, "group")) kmap = Slrn_Group_Keymap;
  198.    else if (!strcmp (map, "article")) kmap = Slrn_Article_Keymap;
  199.    else if (!strcmp (map, "readline")) kmap = Slrn_RLine_Keymap;
  200.    else slrn_exit_error ("%s: line %d:\n%sNo such keymap: %s", This_File, This_Line_Num, This_Line, map);
  201.    
  202.    if (SLang_define_key (key, fun, kmap) != 0)
  203.      {
  204.     slrn_exit_error ("%s: line %d:\n%serror defining key.", This_File, This_Line_Num, This_Line);
  205.      }
  206.    return 0;
  207. }
  208.  
  209. /*}}}*/
  210.  
  211. static int unsetkey_fun (int argc, SLcmd_Cmd_Table_Type *table) /*{{{*/
  212. {
  213.    char *map = table->string_args[1];
  214.    char *key = table->string_args[2];
  215.    SLKeyMap_List_Type *kmap = NULL;
  216.    
  217.    (void) argc;
  218.    
  219.    if (!strcmp (map, "group")) kmap = Slrn_Group_Keymap;
  220.    else if (!strcmp (map, "article")) kmap = Slrn_Article_Keymap;
  221.    else slrn_exit_error ("%s: line %d:\n%sNo such keymap: %s",
  222.              This_File, This_Line_Num, This_Line, map);
  223.    
  224.    SLang_undefine_key (key, kmap);
  225.    return 0;
  226. }
  227.  
  228. /*}}}*/
  229.  
  230. /*}}}*/
  231.  
  232. static int autobaud_fun (int argc, SLcmd_Cmd_Table_Type *table) /*{{{*/
  233. {
  234.    (void) argc; (void) table;
  235.    Slrn_Autobaud = 1;
  236.    return 0;
  237. }
  238.  
  239. /*}}}*/
  240.  
  241. static SLRegexp_Type *compile_quote_regexp (char *str) /*{{{*/
  242. {
  243.    unsigned char *compiled_pattern_buf;
  244.    SLRegexp_Type *r;
  245.    
  246.    compiled_pattern_buf = (unsigned char *) safe_malloc (512);
  247.    r = (SLRegexp_Type *) safe_malloc (sizeof (SLRegexp_Type));
  248.    
  249.    r->pat = (unsigned char *) str;
  250.    r->buf = compiled_pattern_buf;
  251.    r->case_sensitive = 1;
  252.    r->buf_len = 512;
  253.    
  254.    if (SLang_regexp_compile (r))
  255.      {
  256.     slrn_exit_error ("%s: line %d:\n%sInvalid regular expression.",
  257.              This_File, This_Line_Num, This_Line);
  258.      }
  259.    
  260.    return r;
  261. }
  262.  
  263. /*}}}*/
  264. static int ignore_quote_fun (int argc, SLcmd_Cmd_Table_Type *table) /*{{{*/
  265. {
  266.    unsigned int i;
  267.    SLRegexp_Type *r;
  268.    
  269.    if (argc > SLRN_MAX_QUOTE_REGEXP + 1)
  270.      {
  271.     slrn_exit_error ("%s: line %d:\n%sToo many expressions specified.",
  272.              This_File, This_Line_Num, This_Line);
  273.      }
  274.    
  275.    for (i = 0; i < SLRN_MAX_QUOTE_REGEXP; i++)
  276.      {
  277.     r = Slrn_Ignore_Quote_Regexp[i];
  278.     if (r != NULL)
  279.       {
  280.          slrn_free ((char *) r->buf);
  281.          SLFREE (r);
  282.          Slrn_Ignore_Quote_Regexp [i] = NULL;
  283.       }
  284.      }
  285.     
  286.    for (i = 1; i < (unsigned int) argc; i++)
  287.      {
  288.     Slrn_Ignore_Quote_Regexp[i - 1] 
  289.       = compile_quote_regexp (table->string_args[i]);
  290.      }
  291.    return 0;
  292. }
  293.  
  294. /*}}}*/
  295.  
  296. static int grouplens_fun (int argc, SLcmd_Cmd_Table_Type *table) /*{{{*/
  297. {
  298.    (void) argc;
  299. #if SLRN_HAS_GROUPLENS
  300.    (void) slrn_grouplens_add_group (table->string_args[1]);
  301. #else 
  302.    (void) table;
  303. #endif
  304.    return 0;
  305. }
  306.  
  307. /*}}}*/
  308.  
  309.  
  310. static int set_visible_headers_fun (int argc, SLcmd_Cmd_Table_Type *table) 
  311. {
  312.    (void) argc;
  313.    return slrn_set_visible_headers (table->string_args[1]);
  314. }
  315.  
  316. static int set_header_format_fun (int argc, SLcmd_Cmd_Table_Type *table) 
  317. {
  318.    (void) argc;
  319.    return slrn_set_header_format (table->int_args[1], table->string_args